package com.otaku.consumer.rabbitmq;


import com.alibaba.fastjson.JSONObject;
import com.otaku.common.ResultUtils.ResultModel;
import com.otaku.common.util.RestTemplateUtils;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class FanoutSmsConsumer {

    /**
     * 如果消费端业务逻辑出现异常，消费端会消费成功吗？
     *  rabbitmq 在默认情况下，业务出现异常，会自动实现补偿机制，则会不断重试消息消费直到消费成功
     * @param msg
     */
    @RabbitHandler
    @RabbitListener(queues = "fanout_sms_queue")
    public void process(String msg) throws Exception {
        JSONObject object = JSONObject.parseObject(msg);
        String sms = object.get("email").toString();
        System.out.println("短信消费者获取生产者消息msg:" + sms);
        //调用第三方接口转发
        String url = "http://127.0.0.1:8100/sendSms?sms="+sms;
        ResultModel result = RestTemplateUtils.sendMsg(url);
        String code = result.getCode();
        System.out.println("返回状态码："+code);
    }
    //RabbitListener 底层是使用AOP进行拦截，业务未出现异常，自动提交事务
    //反之，AOP捕获到异常，则自动实现补偿机制（重试），该消息会一直缓存在rabbitMQ服务端

    //在消费者配置文件中加入 重试机制配置 限定重试5次，间隔3秒
    // 在重试时，如果发生相同的异常错误，只会打印一次错误信息
}
